package cn.com.seederland.gkrpc.common.utils;

import cn.com.seederland.gkrpc.common.exception.ReflectionException;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName ReflectionUtils
 * @Author SighFate
 * @Date 2020/10/06 21:02
 * @Version 1.0
 * @Description 反射工具类
 */
public class ReflectionUtils {

    /**
     * 根据类创建对象
     * @param clazz 待创建的对象
     * @param <T> 创建的对象的类型
     * @return 指定类型的对象
     */
    public static <T> T newInstance(Class<T> clazz){
        try {
            return clazz.newInstance();
        } catch (Exception e) {
            throw new ReflectionException(e);
        }
    }

    /**
     * 获取指定类的公共方法
     * @param clazz 指定的类
     * @return 类的所有公共方集合
     */
    public static Method[] getPublicMethods(Class clazz){
        Method[] methods = clazz.getDeclaredMethods();
        List<Method> pMethods = new ArrayList<>();
        for (Method m : methods) {
            if (Modifier.isPublic(m.getModifiers())) {
                pMethods.add(m);
            }
        }
        return pMethods.toArray(new Method[0]);
    }

    /**
     * 执行指定的方法
     * @param obj 需要执行方法的类
     * @param method 需要指定的方法
     * @param args 执行方法的参数
     * @return 方法执行后的结果
     */
    public static Object invoke(Object obj,Method method, Object... args) {
        try {
            return method.invoke(obj, args);
        } catch (Exception e){
            throw new ReflectionException(e);
        }
    }
}
